package cn.DesignModel.Responsibility;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: lizemin
 * @version: 1.0
 */
public class ChainFilter implements Filter {
    List<Filter> filters = new ArrayList<>();

    public ChainFilter add(Filter filter) {
        filters.add(filter);
        return this;
    }

    /**
     * 过滤链
     * 亮点1：过滤器链实现Filter接口时，当两个过滤器链组合放到一个数组，执行doFilter会发生递归调用，因为调用了过滤器链中的doFilter方法。
     * 亮点2：当!filter.doFilter(msg)返回false时，停止往下执行，直接进行下一轮for循环
     */
    @Override
    public boolean doFilter(Msg msg) {
        for (Filter filter : filters) {
            if (!filter.doFilter(msg)) {
                //如果当!filter.doFilter(msg)为false时，
                // 下面的return false就不会执行，然后进入到下一个for循环，return true也没有执行
                return false;
            }
        }
        return true;
    }




}
